package ind.csi.simuladorserial;

import java.io.*;
import java.util.*;

import javax.swing.JOptionPane;

import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ControlePorta {

    private OutputStream serialOut;
    private InputStream serialIn;
    private int taxa;
    private String portaCOM;
    private SerialPort port;
    private Thread thread;
    private String tmp;
    private String st;

    /**
     * Construtor da classe ControlePorta
     *
     * @param portaCOM - Porta COM que ser� utilizada para enviar os dados para
     * o arduino
     * @param taxa - Taxa de transfer�ncia da porta serial geralmente 9600
     */
    public ControlePorta(String portaCOM, int taxa, SimuladorSerialController simu) {
        this.portaCOM = portaCOM;
        this.taxa = taxa;
        this.initialize();
        ReadListener read = new ReadListener();
        try {
            read.rodar(port, simu);
        } catch (IOException ex) {
            Logger.getLogger(ControlePorta.class.getName()).log(Level.SEVERE, null, ex);
        } catch (TooManyListenersException ex) {
            Logger.getLogger(ControlePorta.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * M�doto que verifica se a comunicacao com a porta serial esta ok
     */
    private void initialize() {
        try {
            //Define uma vari�vel portId do tipo CommPortIdentifier para realizar a comunicacao serial
            CommPortIdentifier portId = null;
            try {
                //Tenta verificar se a porta COM informada existe
                portId = CommPortIdentifier.getPortIdentifier(this.portaCOM);
            } catch (NoSuchPortException npe) {
                //Caso a porta COM nao exista será exibido um erro 
                JOptionPane.showMessageDialog(null, "Porta COM não encontrada.",
                        "Porta COM", JOptionPane.PLAIN_MESSAGE);
            }
            //Abre a porta COM 
            port = (SerialPort) portId.open("Comunicação serial", this.taxa);
            serialOut = port.getOutputStream();
            port.setSerialPortParams(this.taxa, //taxa de transferencia da porta serial 
                    SerialPort.DATABITS_8, //taxa de 10 bits 8 (envio)
                    SerialPort.STOPBITS_1, //taxa de 10 bits 1 (recebimento)
                    SerialPort.PARITY_NONE); //receber e enviar dados
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * M�todo que fecha a comunicacao com a porta serial
     */
    public void close() {
        try {
            serialOut.close();
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Não foi possível fechar porta COM.",
                    "Fechar porta COM", JOptionPane.PLAIN_MESSAGE);
        }
    }

    /**
     * @param opcao - Valor a ser enviado pela porta serial
     * @throws Exception
     */
    public void enviaDados(byte[] opcao) throws Exception {
        try {
            serialOut.write(opcao);//escreve o valor na porta serial para ser enviado
        } catch (IOException ex) {
            throw new Exception(ex);
        }
    }
    
    public SerialPort getPorta(){
        return this.port;
    }

}
